<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no">
    <meta http-equiv="X-UA-Compatible" content="ie=edge,chrome=1">
    <meta name="referrer" content="never">
    <title>原型链</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }
        ul {
            list-style: none;
        }
    </style>
</head>
<body>
    
    <script type="text/javascript">
        /* 
        原型对象：JS中的函数都有 prototype 指向它的原型对象。可以让构造函数的实例 共享自身的属性。
        对象的原型属性 即 它的 __proto__ 属性，指向创建对象的构造函数的原型
        var obj = {} 通常直接创建的对象原型都指向 Object.prototype

        读取和设置 对象.__proto__ 属性可以读写对象的原型对象

        原型链：原型呈现递进关系，由此形成的链式结构，称为原型链。它提供了对象属性的查找方向，由当前对象沿着原型链向上追溯，返回最近查找到的属性值。原型链的终点是 null
        
        obj 是 函数的实例，函数本身也是对象，JS里面的 鸡蛋问题。Function Object
        */
        var anotherObj = {
            name: "anotherObj",
            age: 24,
            toString(){
                console.log("自定义的toString");
            }
            // __proto__: Object.prototype
        }
        var obj = {
            name: "obj",
            __proto__: anotherObj
        }

        console.log(obj.__proto__.__proto__.__proto__);

        console.log(obj.name); // obj
        console.log(obj.age); // 24
        obj.toString(); // 自定义的toString

        console.log(Function.prototype); // Function
        console.log(Function.__proto__); // Function

        function fn(){
            
        }

        // fn => new Function()  fn.__proto__ = Function.prototype

        console.log(fn.prototype === fn.__proto__); // false
    </script>
</body>
</html>